package com.smart.thrift.model.common;

import cn.hutool.core.util.IdUtil;
import com.smart.thrift.constants.ThriftConstants;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.ArrayList;
import java.util.List;

@Getter
@Setter
@ConfigurationProperties(prefix = "spring.thrift.server")
public class ThriftServerProperties {

    /**
     * 向外暴漏的服务Id，可在环境变量设置，默认随机id，区分单服务多部署唯一
     */
    private String serverId = IdUtil.nanoId();

    /**
     * 向外提供远程服务的地址，默认获取本机地址，容器中设置环境变量
     */
    private String host;

    /**
     * 向外提供远程服务的服务端口号
     */
    private int port = 25000;

    /**
     * 向外提供远程服务的服务标签
     */
    private List<String> tags = new ArrayList<>();

    /**
     * 服务注册中心（默认不开启）
     */
    private ThriftServerDiscoveryProperties discovery;

    /**
     * 多线程服务模式中服务的工作线程队列容量，仅hsHa,threadPool,threadedSelector可用
     */
    private int workerQueueCapacity = 1000;

    /**
     * 服务模型(单线程/多线程/阻塞/非阻塞) 默认hsHa
     * <p>
     * simple: 单线程阻塞模型
     * nonBlocking: 单线程非阻塞模型
     * threadPool: 线程池同步模型
     * hsHa: 半同步半异步模型
     * threadedSelector: 线程池选择器模型
     * </p>
     */
    private String serviceModel = ThriftConstants.ServiceModel.SERVICE_MODEL_DEFAULT;

    /**
     * threadPool服务模型配置
     */
    private TThreadPoolServerProperties threadPool = new TThreadPoolServerProperties();

    private THsHaServerProperties hsHa = new THsHaServerProperties();

    private TThreadedSelectorServerProperties threadedSelector = new TThreadedSelectorServerProperties();

    @Getter
    @Setter
    public static class ThriftServerDiscoveryProperties {

        /**
         * 是否允许服务注册
         */
        private Boolean enabled = false;

        /**
         *
         */
        private String discoveryType = ThriftConstants.DiscoveryType.DISCOVERY_DEFAULT;

        /**
         * 服务注册中心的地址
         */
        private String host;

        /**
         * 服务注册中心的端口号(默认2181)
         */
        private Integer port = 2181;
    }

    @Getter
    @Setter
    public static class THsHaServerProperties {

        /**
         * 最少工作线程数量
         */
        private int minWorkerThreads = 5;

        /**
         * 最多工作线程数量
         */
        private int maxWorkerThreads = 20;

        /**
         * 线程的存活时间 (min)
         */
        private int keepAlivedTime = 1;

    }

    @Getter
    @Setter
    public static class TThreadedSelectorServerProperties {

        /**
         * 接收连接的Selector线程数量
         */
        private int selectorThreads = 2;

        /**
         * 处理任务的最小工作线程池大小
         * 如果为0，默认由Selector线程进行处理
         */
        private int minWorkerThreads = 5;

        /**
         * 处理任务的最大工作线程池大小
         */
        private int maxWorkerThreads = 20;

        /**
         * 工作线程池中的线程的存活时间
         */
        private int keepAlivedTime = 5;
    }

    @Getter
    @Setter
    public static class TThreadPoolServerProperties {

        /**
         * 最少工作线程的数量
         */
        private int minWorkerThreads = 5;

        /**
         * 最大工作线程的数量
         */
        private int maxWorkerThreads = 20;

        /**
         * 线程的存活时间
         */
        private int keepAlivedTime = 1;
    }
}
